#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
union Data
{
   int i;
   float f;
   char  str[20];
};

void init_union_variable_and_get_size(void)
{
   union Data data;
   printf( "Memory size occupied by union variable data : %d byte\n", sizeof(data));
}


void set_and_access_muti_union_variables(void)
{
   union Data data;
 
   data.i = 10;
   data.f = 220.5;
   strcpy( data.str, "C Programming");
 
   printf( "data.i should be 10 but it is : %d\n", data.i); // damage
   printf( "data.f  should be 220.5 but it is : %f\n", data.f); // damage
   printf( "data.str  : %s\n", data.str); // soundness
}


void only_using_the_same_variable_at_the_same_time(void)
{
   union Data data;
 
   data.i = 10;
   printf( "data.i : %d\n", data.i);
   
   data.f = 220.5;
   printf( "data.f : %f\n", data.f);
   
   strcpy( data.str, "C Programming");
   printf( "data.str : %s\n", data.str);
}


int main( )
{
    init_union_variable_and_get_size();

    set_and_access_muti_union_variables();

    only_using_the_same_variable_at_the_same_time();
    system("pause");
    return 0;
}




/*
共用体是一种特殊的数据类型，允许您在相同的内存位置存储不同的数据类型。
您可以定义一个带有多成员的共用体，但是任何时候只能有一个成员带有值。
共用体提供了一种 **使用相同的内存位置** 的有效方式。

    union [union tag]
    {
    member definition;
    member definition;
    ...
    member definition;
    } [one or more union variables];

Data 类型的变量可以存储一个整数、一个浮点数，或者一个字符串。
这意味着  **一个变量（相同的内存位置）可以存储多个多种类型的数据**。
您可以根据需要在一个共用体内使用任何内置的或者用户自定义的数据类型。
*/